/*
*    へ　　　　　  ／|
*    /＼7　　   ∠＿/
*    /　│　　 ／　／               
*    │　Z ＿,＜　／　　 /`ヽ     
*    │　　　　　ヽ　　 /　　〉    
*    Y　　　　　  `  /　　/     
*    ｲ ●　､　●　⊂⊃〈　　/       
*    ()  へ　　　　 |　＼       
*    >ｰ ､_　 ィ　 │ ／／        | @author:smily
*    / へ　　 /　ﾉ＜| ＼＼       | @project:net-hole
*    ヽ_ﾉ　　(_／　 │／／        | @file: MySocket.h
*    7　　　　　　　|／          | @time: 2020/12/29 11:02
*====＞―r￣￣`ｰ―＿===========    
*^^^^^^^^^^^^^^^^^^^^^^^^^^^
*/

#ifndef NET_HOLE_MYSOCKET_H
#define NET_HOLE_MYSOCKET_H


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

class MySocket
{
public:
    MySocket();
    ~MySocket();

protected:
    int socket_fd;
    struct sockaddr_in server_addr;
    char err_msg[256];

public:
    //初始化socket环境，只调用一次
    bool init_socket();
    //获取错误信息
    char* get_err_msg();
};

class MySocketServer :public MySocket
{
private:
    int recvbytes, res, flags;
    int client_fd;
public:
    bool create_server(unsigned int port);

    bool accept_client(int &client_socket);
    // 接收数据
    // 出参：buffer 缓存区
    // 入参：bufferLen 缓存区大小
    // 出参：recvLen 已接收数据的大小
    bool recv_data(char * buffer, int buffer_len, int& recv_len);

    bool send_data(const char * data, int len);

    void close_client(int client_socket);

    void close_server();
};



class MySocketClient :public MySocket
{
public:
    bool client_connect(const char* ip, unsigned int port);
    // 接收数据
    // 出参：buffer 缓存区
    // 入参：bufferLen 缓存区大小
    // 出参：recvLen 已接收数据的大小
    bool recv_data(char * buffer, int buffer_len, int& recv_len);

    bool send_data(const char * data, int len);

    void client_close();
};


#endif //NET_HOLE_MYSOCKET_H
